<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>高性能mysql</title>
    <style>
        body {
            background-color: #c7edcc
        }
    </style>
</head>
<body>
<pre>
    看了高性能mysql这本书,应该知道的东西

    1.mysql结构?
        三层结构:网络层+服务器层(查询缓存,解析,优化等)+物理存储引擎
        网络层:处理客户端查询请求,任何网络服务器都具备这个功能
        服务器层:mysql主要核心功能都在这一层,包括各种函数,解析,优化,存储过程,触发器等
        存储引擎:负责数据的存储与提取,服务器通过api与存储引擎通信,api接口屏蔽了不同存储引擎之间的差异


    2.锁
        并发访问数据库的时候,数据库时刻都可能有锁定操作,为了保证数据安全必须使用各种锁,但锁的使用并不是没有
    开销的,获取锁,释放锁,检查锁都需要开销,所以在数据存取和锁策略之间需要有个权衡.
        表锁:开销最小的锁,粒度大,并发性不好
        行锁:开销大,粒度小,并发性好

        锁在事务执行过程中随时可以锁定,只有在commit和rollback之后才会同时释放所有的锁,不会锁定一行数据,修改后就直接释放锁
        如果不一直锁定该行,则其它事务就可以修改改行数据了,最终结果以哪个为准就无法判断

    3.索引
        索引用于提高查询速度,在存储引擎层实现,索引也需要开销,如果建立了索引,那么增加和删除数据的时候,相应的需要添加和删除索引.
    当使用索引查找时,首先根据查找值在索引中寻找,然后返回对应的数据地址.
        索引使用B-Tree来存储,查找快,而且B-Tree是一种专门为磁盘IO设计的数据结构,一次性可以读取整个节点数据,减少IO操作
        索引类型:
        B-Tree索引,其中存储了值,有的查找不需要读取数据,根据索引就可以完成.减少需要扫描的数据量,将随机io变为顺序io
        Hash索引,没有值,需要找到数据所在位置
        Memory存储引擎是唯一一个支持Hash索引,因为Memory引擎将数据存储在内存中,重启数据丢失.而且数据插入后不会被修改,这就是一个
    只读缓存.Hash索引不适合其它存储引擎是因为当表很大的时候,索引也很大,需要存储在硬盘中,但一次性读入如此大的索引内存占用会比较大

        索引选择性:索引不重复的行数量和数据总行数T的比值,结果为1/T到1之间,唯一索引选择性最好为1

        为每个列创建独立索引,key(a),key(b)...

        索引的有效使用:

        create table People{
            last_name varchar(50) not null,
            first_name varchar(50) not null,
            birth date not null,
            gender enum('m','f'),
            key(last_name,first_name,birth);
        }

        一.可以使用B-Tree索引查询的类型
        1.全值匹配,也就是精确比较,可以查找姓名为Cuba Allen,出生为1930-05-01的人,查找列于索引列顺序完全匹配
        2.匹配最左前缀,查找姓为Cuba的人, 即只使用第一个索引
        3.匹配列前缀,超找已J为开头的姓
        4.匹配范围值,查找两个姓之间的人,其实也只使用了第一个索引
        5.精确匹配某一列,再匹配列前缀这种组合,注意不能跳过某个索引列,跳过导致后面的索引无效
        6.只访问索引的查询,因为B-Tree存储了值,所以只访问索引列不会查询数据行.

        二.B-Tree索引的限制
        1.不按照索引的最左列开始查找,将无法使用索引.例如查找某个名字为Bill的人将导致全表扫描
        2.不能跳过索引列,只用姓和出生日期查找,将导致只使用了索引的第一列,出生列索引无效
        3.如果某个列使用了范围查询,则索引右边的列都无法使用索引优化查询

        Hash索引,就当理解为一个HashMap.查找更快,MySQL的Memory引擎支持,Hash索引格式很紧凑,一次性加载到内存中相比要比B-Tree节约内存些.所以在Memory引擎中使用
        使用非常频繁的数据查找可以使用Hash索引优化,Innodb有个功能叫自适应hash索引,就是将使用很频繁的索引在B-Tree之上在加上一个Hash索引,优化策略.
        当在B-Tree查找很长的字符串时,可以使用hash优化,加快查找

        一个包含多个列的索引,如果只使用第一个列来查询,结果居然全表扫描了,原来是mysql优化器对于小表直接全表扫描了,比使用索引更高效,可以强制使用索引force index (age)

        多列索引中的顺序,一般选择性高的列在前面,可以使用个去重查询计算列的选择性


        使用explain查看查询语句如何使用索引以及连接表,可以用来帮助优化索引

        explain输出字段含义:
        type：这是重要的列，显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL
        rows：MYSQL认为必须检查的用来返回请求数据的行数,就是扫描了多少行


        show命令:查看系统变量show varibables 和 系统状态show status; 两者都可以使用like查找, 系统变量可以修改但是状态没法修改
        例如修改max_connections, set global max_connections = 6; 当客户端连接超过6个,会报1040错误,不允许继续连接


        使用数据库首先要解决几个问题:
        1.数据安全,硬盘坏了,程序崩溃了怎么办?允许多大时间数据丢失?对于不允许数据丢失的应用每次修改都需要保存数据,保存数据的同时要避免
        硬盘损坏导致数据丢失,

</pre>
</body>
</html>